---
title: 使用coverlet统计单元测试的代码覆盖率
sidebar_position: 1
---

# 使用coverlet统计单元测试的代码覆盖率

单元测试是个好东西, 可以在一定程度上兜底

虽然写单元测试这件事情非常麻烦

但是好的单元测试可以显著提高代码质量, 减少bug, 避免无意中的修改导致其他模块出错

写测试用例的过程中, 靠人力去确保所有代码都被覆盖是一件挺麻烦的事情

本文主要介绍如何在xunit下使用coverlet统计测试覆盖率

## 环境介绍

* 系统: wsl2
* 编辑器: vscode
* 插件: C# + Coverlet + Coverage Gutters

## 代码

`TestFunc.cs`
```csharp
public class TestFunc
{
    public static string Test1()
    {
        return "Test1";
    }
    public static string Test2()
    {
        return "Test2";
    }
}
```

测试代码:
```csharp
[Fact]
public void Test1()
{
    Assert.True(TestFunc.Test1()=="Test1");
    Assert.False(TestFunc.Test1()=="Test2");
}
```

通过 `dotnet test` 运行后

![origin](/img/xunit/origin.webp)

只会显示多少通过, 多少失败, 并不知道哪些代码被覆盖到了

## 显示覆盖率

### 修改csproj

首先需要修改单元测试项目的 `csproj` 文件

在开头的 `PropertyGroup` 块中添加

```xml
<CollectCoverage>true</CollectCoverage>
<CoverletOutputFormat>cobertura</CoverletOutputFormat>
```
用于生成测试的覆盖报告 `coverage.cobertura.xml`

之后再 `ItemGroup` 中添加

```xml
<PackageReference Include="coverlet.msbuild" Version="3.1.0"/>
```

之后运行 `dotnet test` 测试

![cover](/img/xunit/cover.webp)

就会多显示一些覆盖率的内容

## 查看具体的覆盖情况

安装 Coverlet 和 Coverage Gutters 插件之后

进入被调用的文件内, 在vscode的下方状态栏中会显示当前文件的覆盖率情况

![cover-before](/img/xunit/cover-before.webp)

上图为初始状态

点击这个 Watch 之后会开始解析 `coverage.cobertura.xml`

![cover-after](/img/xunit/cover-after.webp)

之后会显示当前文件覆盖率

![cover-detail](/img/xunit/cover-detail.webp)

同时编辑器窗口中也会通过比较显眼的绿色(覆盖)红色(未覆盖)标记覆盖情况

